home *** CD-ROM | disk | FTP | other *** search
/ SGI Origin & Onyx2 Patches 1998 May / Origin and Onyx2 System Disk Patches May 1998.img / dist / patchSG0002047.idb / usr / include / sys / vme / universe.h.z / universe.h
C/C++ Source or Header  |  1997-12-08  |  15KB  |  406 lines

  1. /*
  2.  * Copyright 1996-1997, Silicon Graphics, Inc.
  3.  * ALL RIGHTS RESERVED
  4.  *
  5.  * UNPUBLISHED -- Rights reserved under the copyright laws of the United
  6.  * States.   Use of a copyright notice is precautionary only and does not
  7.  * imply publication or disclosure.
  8.  *
  9.  * U.S. GOVERNMENT RESTRICTED RIGHTS LEGEND:
  10.  * Use, duplication or disclosure by the Government is subject to restrictions
  11.  * as set forth in FAR 52.227.19(c)(2) or subparagraph (c)(1)(ii) of the Rights
  12.  * in Technical Data and Computer Software clause at DFARS 252.227-7013 and/or
  13.  * in similar or successor clauses in the FAR, or the DOD or NASA FAR
  14.  * Supplement.  Contractor/manufacturer is Silicon Graphics, Inc.,
  15.  * 2011 N. Shoreline Blvd. Mountain View, CA 94039-7311.
  16.  *
  17.  * THE CONTENT OF THIS WORK CONTAINS CONFIDENTIAL AND PROPRIETARY
  18.  * INFORMATION OF SILICON GRAPHICS, INC. ANY DUPLICATION, MODIFICATION,
  19.  * DISTRIBUTION, OR DISCLOSURE IN ANY FORM, IN WHOLE, OR IN PART, IS STRICTLY
  20.  * PROHIBITED WITHOUT THE PRIOR EXPRESS WRITTEN PERMISSION OF SILICON
  21.  * GRAPHICS, INC.
  22.  */
  23.  
  24. #ident "$Revision: 1.15 $"
  25.  
  26. /* 
  27.  * Since the VME subsystem is in use by two different groups of users,
  28.  * the device driver writers and the user level VME users, the VME
  29.  * support files should try to avoid as much kernel data structure
  30.  * dependency as possible.  XXX Try to hide all the data member
  31.  * details in this file This file is to be used only by the kernel and
  32.  * SGI internal user libraries, namely, user level dma engine library.  
  33.  */
  34.  
  35. #ifndef __SYS_VME_UNIVERSE_H__
  36. #define __SYS_VME_UNIVERSE_H__
  37.  
  38. /* All registers of the Universe chip are 32 bits wide */
  39. typedef volatile __uint32_t universe_reg_t;
  40.  
  41. /* -----------------------------------------------------------------------
  42.  
  43.   Addresses of all Universe registers 
  44.  
  45.   ------------------------------------------------------------------------ */
  46.  
  47. /* Universe PCI specific register definitions */
  48. #define    UNIVERSE_PCI_ID        (0x0)      /* Configuration ID                 */
  49. #define    UNIVERSE_PCI_CSR    (0x4)      /* Command/status                */
  50. #define    UNIVERSE_PCI_CLASS    (0x8)      /* Configuration Class         */
  51. #define    UNIVERSE_PCI_MISC0    (0xc)      /* Miscellaneous 0                */
  52. #define    UNIVERSE_PCI_BS        (0x10)      /* Config Base address        */
  53. #define    UNIVERSE_PCI_MISC1    (0x3c)      /* Miscellaneous 1                */
  54.  
  55. /* Universe PCI slave image registers */
  56. #define    UVLS_BASE        (0x100)      /* Start of local slave image     */
  57.  
  58. /* Special Cycle control register */
  59. #define    UVSPL_SCYC_CTL        (0x170)   /* Special cycle control register */
  60. #define    UVSPL_SCYC_ADDR        (0x174)      /* Special cycle address register */
  61. #define    UVSPL_SCYC_EN        (0x178)      /* Special cycle Enable register  */
  62. #define    UVSPL_SCYC_CMP        (0x17c)   /* Special cycle Compare register */
  63. #define    UVSPL_SCYC_SWP        (0x180)   /* Special cycle Swap register    */
  64. #define    UVSPL_LMISC        (0x184)   /* Special cycle Misc register    */
  65.  
  66. /* PCI slave images */
  67. #define    UNIVERSE_PCISIMG_SPEC    (0x188)   /* Special PCI slave image        */
  68.  
  69. /* PCIbus error */
  70. #define UNIVERSE_L_CMDERR       (0x18c)   /* PCIbus command error log */
  71. #define UNIVERSE_L_AERR         (0x190)   /* PCIbus address error log */
  72.  
  73. /* DMA Engine */
  74. #define    UNIVERSE_DMA_CTL    (0x200)   /* DMA Control               */
  75. #define    UNIVERSE_DMA_VA     (0x210)      /* VMEbus address               */
  76. #define    UNIVERSE_DMA_CPP    (0x218)      /* Command packet pointer        */
  77. #define    UNIVERSE_DMA_LLUE    (0x224)      /* DMA linked list update enable */
  78. #define    UNIVERSE_DMA_TBC    (0x204)      /* Transfer byte count           */
  79. #define    UNIVERSE_DMA_LA            (0x208)      /* PCIbus lower address       */
  80. #define    UNIVERSE_DMA_GCS    (0x220)      /* General cmd/status register   */
  81.  
  82. /* Interrupt on PCIbus */
  83. #define    UNIVERSE_LINT_EN        (0x300)      /* Enable                        */
  84. #define    UNIVERSE_LINT_STAT      (0x304)      /* Status                        */
  85. #define    UNIVERSE_LINT_MAP0    (0x308)      /* mapping betn VME<->LCL intr   */
  86. #define    UNIVERSE_LINT_MAP1    (0x30c)      /* mapping betn LCL<->LCL intr   */
  87.  
  88. /* Interrupt on VMEbus -- not used on SGI platforms */
  89. #define    UVINT_VME_ENBL        (0x310)    
  90. #define    UVINT_VME_STAT        (0x314)
  91. #define    UVINT_VME_MAP0        (0x318)
  92. #define    UVINT_VME_MAP1        (0x31c)
  93.  
  94. #define    UVINT_STATID        (0x320)    /* 31:24 holds the vector returned 
  95.                      * by universe as part of iack cycle */
  96.  
  97. #define    UVINT_VIRQ1_STATID    (0x324)    /* VME IRQ 1 Status/IACK vector Value */
  98. #define    UVINT_VIRQ2_STATID    (0x328)    /* VME IRQ 2 Status/IACK vector value */
  99. #define    UVINT_VIRQ3_STATID    (0x32c)    /* VME IRQ 3 Status/IACK vector value */
  100. #define    UVINT_VIRQ4_STATID    (0x330)    /* VME IRQ 4 Status/IACK vector value */
  101. #define    UVINT_VIRQ5_STATID    (0x334)    /* VME IRQ 5 Status/IACK vector value */
  102. #define    UVINT_VIRQ6_STATID    (0x338)    /* VME IRQ 6 Status/IACK vector value */
  103. #define    UVINT_VIRQ7_STATID    (0x33c)    /* VME IRQ 7 Status/IACK vector value */
  104.  
  105. /* Miscellaneous control registers */
  106. #define    UNIVERSE_MAST_CTL    (0x400)    /* Master control register     */
  107. #define    UNIVERSE_MISC_CTL    (0x404)    /* Misc Control register    */
  108. #define    UNIVERSE_MISC_STAT    (0x408)    /* Misc Status register        */
  109. #define    UNIVERSE_USER_AM    (0x40c) /* Defines values of User AM    */
  110.  
  111. /* Universe VME Slave image control registers */
  112. #define    UNIVERSE_VMESIMG_BASE    (0xf00)    /* Start of VME slave image     */
  113.  
  114.  
  115. /* VMEbus error */
  116. #define UNIVERSE_V_AMERR        (0xf88) /* VMEbus addr modifier error log */
  117. #define UNIVERSE_V_AERR         (0xf8c) /* VMEbus address error log */
  118.  
  119. /* VMEbus CSR registers */
  120. #define UNIVERSE_VCSR_CLR       (0xff4) /* VMEbus CSR Bit Clear         */
  121. #define UNIVERSE_VCSR_SET       (0xff8) /* VMEbus CSR Bit Set           */
  122.  
  123. /*
  124.  * IO graph specific definitions for VME Bus 
  125.  */
  126. #define    EDGE_ROOT_VMEBUS    "vme"
  127. extern    vertex_hdl_t        root_vmebus;
  128.  
  129.  
  130. #define    VME_IRQMAX        8
  131.  
  132. /* This file defines the various data structures used to manage the
  133.  * VME Bus subsystem provided via Newbridge's Universe  PCI<-> VME
  134.  * Controller.
  135.  */
  136. #define    UNIV_VALID        0xFEEDDEAD
  137.  
  138.  
  139.  
  140. /* ------------------------------------------------------------------------
  141.   
  142.                                DMA Engine 
  143.  
  144.    ------------------------------------------------------------------------ */
  145.  
  146. #if _KERNEL
  147.  
  148. /* Little endian version */
  149. typedef struct universe_dma_ctl_s {
  150.     universe_reg_t l2v:       1,
  151.                        reserved0: 7,
  152.                        vdw:       2,
  153.                        reserved1: 3, 
  154.                    vas:       3,
  155.                    pgm:       2,
  156.                    super:     2,
  157.                        reserved2: 3,
  158.                        vct:       1,
  159.                        ld64en:    1,
  160.                    reserved3: 7;
  161. } universe_dma_ctl_t;
  162.  
  163. #else
  164.  
  165. /* Big endian version */
  166. typedef struct universe_dma_ctl_s {
  167.     universe_reg_t ld64en:    1,
  168.                    reserved3: 7,
  169.                        pgm:       2,
  170.                    super:     2,
  171.                        reserved2: 3,
  172.                        vct:       1,
  173.                        vdw:       2,
  174.                        reserved1: 3, 
  175.                    vas:       3,
  176.                l2v:       1,
  177.                        reserved0: 7;
  178. } universe_dma_ctl_t;
  179.  
  180. #endif 
  181.  
  182. #define UNIVERSE_DMA_CTL_L2V_READ             (0x0)
  183. #define UNIVERSE_DMA_CTL_L2V_WRITE            (0x1)
  184. #define UNIVERSE_DMA_CTL_VDW_8                (0x0)
  185. #define UNIVERSE_DMA_CTL_VDW_16               (0x1)
  186. #define UNIVERSE_DMA_CTL_VDW_32               (0x2)
  187. #define UNIVERSE_DMA_CTL_VDW_64               (0x3)
  188. #define UNIVERSE_DMA_CTL_VAS_A16              (0x0)
  189. #define UNIVERSE_DMA_CTL_VAS_A24              (0x1)
  190. #define UNIVERSE_DMA_CTL_VAS_A32              (0x2)
  191. #define UNIVERSE_DMA_CTL_VAS_USER1            (0x6)
  192. #define UNIVERSE_DMA_CTL_VAS_USER2            (0x7)
  193. #define UNIVERSE_DMA_CTL_PGM_DATA             (0x0)
  194. #define UNIVERSE_DMA_CTL_PGM_PROGRAM          (0x1)
  195. #define UNIVERSE_DMA_CTL_SUPER_N              (0x0)
  196. #define UNIVERSE_DMA_CTL_SUPER_S              (0x1)
  197. #define UNIVERSE_DMA_CTL_VCT_SINGLE           (0x0)
  198. #define UNIVERSE_DMA_CTL_VCT_BLOCK            (0x1)
  199. #define UNIVERSE_DMA_CTL_LD64EN_OFF           (0x0)
  200. #define UNIVERSE_DMA_CTL_LD64EN_ON            (0x1)
  201.  
  202. typedef universe_reg_t universe_dma_tbc_t;
  203. typedef universe_reg_t universe_dma_la_t;
  204. typedef universe_reg_t universe_dma_va_t;
  205.  
  206. #if _KERNEL
  207. typedef struct universe_dma_cpp_s {
  208.     universe_reg_t addr_31_3:  29,
  209.                    reserved:    1,
  210.                    processed:   1,
  211.                    null:        1;
  212. } universe_dma_cpp_t;
  213. #else 
  214. typedef struct universe_dma_cpp_s {
  215.     universe_reg_t reserved0:   6,
  216.                    processed:   1,
  217.                        null:        1,
  218.                    reserved1:  24;
  219.  
  220. } universe_dma_cpp_t;
  221. #endif 
  222.  
  223. #define UNIVERSE_DMA_CPP_ADDR_SHIFT       (3)
  224. #define UNIVERSE_DMA_CPP_PROCESSED_CLEAR  (0x0)
  225. #define UNIVERSE_DMA_CPP_PROCESSED_NO     (0x0)
  226. #define UNIVERSE_DMA_CPP_PROCESSED_YES    (0x1)
  227. #define UNIVERSE_DMA_CPP_NULL_CONTINUE    (0x0)
  228. #define UNIVERSE_DMA_CPP_NULL_FINAL       (0x1)
  229.  
  230. typedef struct universe_dma_gcs_s {
  231.     universe_reg_t go:        1,
  232.                    stop_req:  1,
  233.                    halt_req:  1,
  234.                    reserved0: 1,
  235.                        chain:     1,
  236.                    reserved1: 3,
  237.                    von:       4,
  238.                voff:      4,
  239.                    act:       1,
  240.                    stop:      1,
  241.                    halt:      1,
  242.                        reserved2: 1,
  243.                        done:      1,
  244.                        lerr:      1,
  245.                        verr:      1,
  246.                        perr:      1,
  247.                        reserved3: 1,
  248.                    int_stop:  1,
  249.                    int_halt:  1,
  250.                    reserved4: 1,
  251.                    int_done:  1,
  252.                    int_lerr:  1,
  253.                    int_verr:  1,
  254.                    int_m_err: 1;
  255. } universe_dma_gcs_t;
  256.  
  257. #define UNIVERSE_DMA_GCS_GO_ENABLE           (0x1)
  258. #define UNIVERSE_DMA_GCS_CHAIN_DIRECT        (0x0)
  259. #define UNIVERSE_DMA_GCS_CHAIN_LINKEDLIST    (0x1)
  260. #define UNIVERSE_DMA_GCS_VON_UNTILDONE       (0x0)
  261. #define UNIVERSE_DMA_GCS_VON_256B            (0x1)
  262. #define UNIVERSE_DMA_GCS_VON_512B            (0x2)
  263. #define UNIVERSE_DMA_GCS_VON_1024B           (0x3)
  264. #define UNIVERSE_DMA_GCS_VON_2048B           (0x4)
  265. #define UNIVERSE_DMA_GCS_VON_4096B           (0x5)
  266. #define UNIVERSE_DMA_GCS_VON_8192B           (0x6)
  267. #define UNIVERSE_DMA_GCS_VON_16384B          (0x7)
  268. #define UNIVERSE_DMA_GCS_ACT_NOTACTIVE       (0x0)
  269. #define UNIVERSE_DMA_GCS_ACT_ACTIVE          (0x1)
  270. #define UNIVERSE_DMA_GCS_STOP_NOTSTOPPED     (0x0)
  271. #define UNIVERSE_DMA_GCS_STOP_STOPPED        (0x1)
  272. #define UNIVERSE_DMA_GCS_HALT_NOTHALTED      (0x0)
  273. #define UNIVERSE_DMA_GCS_HALT_HALTED         (0x1)
  274. #define UNIVERSE_DMA_GCS_DONE_NOTCOMPLETED   (0x0)
  275. #define UNIVERSE_DMA_GCS_DONE_COMPLETED      (0x1)
  276. #define UNIVERSE_DMA_GCS_DONE_CLEAR          UNIVERSE_DMA_GCS_DONE_COMPLETED
  277. #define UNIVERSE_DMA_GCS_LERR_NOERROR        (0x0)
  278. #define UNIVERSE_DMA_GCS_LERR_ERROR          (0x1)
  279. #define UNIVERSE_DMA_GCS_LERR_CLEAR          UNIVERSE_DMA_GCS_LERR_ERROR  
  280. #define UNIVERSE_DMA_GCS_VERR_NOERROR        (0x0)
  281. #define UNIVERSE_DMA_GCS_VERR_ERROR          (0x1)
  282. #define UNIVERSE_DMA_GCS_VERR_CLEAR          UNIVERSE_DMA_GCS_VERR_ERROR
  283. #define UNIVERSE_DMA_GCS_PERR_NOERROR        (0x0)
  284. #define UNIVERSE_DMA_GCS_PERR_ERROR          (0x1)
  285. #define UNIVERSE_DMA_GCS_PERR_CLEAR          UNIVERSE_DMA_GCS_PERR_ERROR 
  286. #define UNIVERSE_DMA_GCS_INT_STOP_ENABLED    (0x1)
  287. #define UNIVERSE_DMA_GCS_INT_STOP_DISABLED   (0x0)
  288. #define UNIVERSE_DMA_GCS_INT_STOP_ENABLED    (0x1)
  289. #define UNIVERSE_DMA_GCS_INT_HALT_DISABLED   (0x0)
  290. #define UNIVERSE_DMA_GCS_INT_HALT_ENABLED    (0x1)
  291. #define UNIVERSE_DMA_GCS_INT_DONE_DISABLED   (0x0)
  292. #define UNIVERSE_DMA_GCS_INT_DONE_ENABLED    (0x1)
  293. #define UNIVERSE_DMA_GCS_INT_LERR_DISABLED   (0x0)
  294. #define UNIVERSE_DMA_GCS_INT_LERR_ENABLED    (0x1)
  295. #define UNIVERSE_DMA_GCS_INT_VERR_DISABLED   (0x0)
  296. #define UNIVERSE_DMA_GCS_INT_VERR_ENABLED    (0x1)
  297. #define UNIVERSE_DMA_GCS_INT_M_ERR_DISABLED  (0x0)
  298. #define UNIVERSE_DMA_GCS_INT_M_ERR_ENABLED   (0x1)
  299.  
  300. typedef struct universe_dma_llue_s {
  301.     universe_reg_t update:    1,
  302.                        reserved: 31;
  303. } universe_dma_llue_t;
  304.  
  305. #define UNIVERSE_DMA_LLUE_UPDATE_ON          (1)
  306. #define UNIVERSE_DMA_LLUE_UPDATE_OFF         (0)
  307.  
  308. typedef struct universe_dma_engine_regs_s {
  309.     universe_dma_ctl_t    ctl;
  310.     universe_dma_tbc_t    tbc;
  311.     universe_dma_la_t     la;
  312.     universe_reg_t        reserved0; 
  313.     universe_dma_va_t     va;
  314.     universe_reg_t        reserved1;
  315. #if _KERNEL
  316.     universe_dma_cpp_t    cpp; 
  317. #else
  318.     universe_reg_t        cpp; 
  319. #endif
  320.     universe_reg_t        reserved2;
  321.     universe_dma_gcs_t    gcs;
  322.     universe_dma_llue_t   llue;
  323. } universe_dma_engine_regs_t;
  324.  
  325. #define UNIVERSE_DMA_ENGINE_REGS_SIZE (sizeof(universe_dma_engine_regs_t))
  326.  
  327. /* 
  328.  * Linked list command packet object
  329.  */
  330. typedef struct universe_dma_engine_linked_list_packet_s {
  331.     universe_dma_ctl_t   ctl;    /* Dma Control Parameters */
  332.     universe_dma_tbc_t   tbc;    /* DMA transfer Count     */
  333.     universe_dma_la_t    pciaddr;    /* DMA PCI Bus address    */
  334.     universe_reg_t       reserved0; 
  335.     universe_dma_va_t    vmeaddr;    /* DMA VME Bus address    */
  336.     universe_reg_t       reserved1;
  337.     universe_dma_cpp_t   cpp;       /* DMA command packet ptr */
  338.     universe_reg_t       reserved2; 
  339. } * universe_dma_engine_linked_list_packet_t;
  340.  
  341. #define UNIVERSE_DMA_ENGINE_LINKED_LIST_PACKET_SIZE (                     \
  342.         sizeof(struct universe_dma_engine_linked_list_packet_s))
  343.  
  344. /* XXX Tunable parameters */
  345. /* XXXXX Bringup setting */
  346. #define UNIVERSE_DMA_ENGINE_LINKED_LIST_MAX_PACKETS (256) 
  347.  
  348. #define UNIVERSE_DMA_ENGINE_LINKED_LIST_SIZE (                            \
  349.         UNIVERSE_DMA_ENGINE_LINKED_LIST_MAX_PACKETS *                     \
  350.         UNIVERSE_DMA_ENGINE_LINKED_LIST_PACKET_SIZE)
  351.  
  352. /* Values for dma_flags */
  353. #define    UNDMA_ACTIVE        1    /* DMA Currently active */
  354. #define    UNDMA_CHMODE        2    /* DMA In Chain Mode */
  355.  
  356.  
  357. /* ------------------------------------------------------------------------
  358.   
  359.                     Common knowledge across system call
  360.  
  361.    ------------------------------------------------------------------------ */
  362.  
  363. /* 
  364.  * Convention used by the mapping call 
  365.  */
  366. #define UNIVERSE_DMA_ENGINE_REGS_OFFSET        (0)
  367. #define UNIVERSE_DMA_ENGINE_LINKED_LIST_OFFSET (16384)
  368.  
  369. /*
  370.  * One buffer -- system's view
  371.  * Passed out by an ioctl call
  372.  */
  373. #define UNIVERSE_DMA_ENGINE_BUF_MAX_ITEMS 64
  374.  
  375. typedef struct universe_dma_engine_buffer_internal_item_s {
  376.     /* void *       addr; */
  377.     unsigned int addr;
  378.     /* size_t       byte_count; */
  379.     unsigned int byte_count; 
  380. } universe_dma_engine_buffer_internal_item_t;
  381.  
  382. /* XXX a pointer to the type more aesthetic ? */
  383. typedef struct universe_dma_engine_buffer_internal_s {
  384.     unsigned int         num_of_items;
  385. #if _KERNEL
  386. #ifndef _ABI64
  387.     unsigned int         pad;
  388. #endif
  389.     pciio_dmamap_t         pci_dmamap;
  390. #else
  391.     unsigned long long    pci_dmamap;
  392. #endif
  393.     universe_dma_engine_buffer_internal_item_t alens[UNIVERSE_DMA_ENGINE_BUF_MAX_ITEMS];
  394. } universe_dma_engine_buffer_internal_t;
  395.  
  396. /* Command for ioctl */
  397. #define UDE_IOCTL_BUFPREP          (0)
  398. #define UDE_IOCTL_BUFTEAR          (1)
  399.  
  400. #endif /* __SYS_VME_UNIVERSE_H__ */
  401.  
  402.  
  403.  
  404.  
  405.  
  406.